Invalidate cairo surface if resizing is not supported for target
authorKristian Rietveld <kris@gtk.org>
Sun, 8 Aug 2010 16:17:29 +0000 (18:17 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 10 Aug 2010 19:02:31 +0000 (21:02 +0200)
While X11 surfaces can be resized, this is not the case for Quartz
surfaces.  Instead of resizing we will invalidate the surface instead.
By giving _gdk_windowing_set_cairo_surface_size() a boolean return
value, we can signal back whether or not resizing was possible.  If not
possible, we invalidate the surface.

gdk/gdkinternals.h
gdk/gdkwindow.c
gdk/quartz/gdkdrawable-quartz.c
gdk/win32/gdkdrawable-win32.c
gdk/x11/gdkdrawable-x11.c

index 9ff1d9277a2e835668bc9ff8685bb9f277513dd0..694391d83c1bf910a791e46d2722647d70fad93a 100644 (file)
@@ -511,9 +511,9 @@ void _gdk_display_pointer_info_foreach (GdkDisplay                   *display,
 void _gdk_window_invalidate_for_expose (GdkWindow       *window,
                                        cairo_region_t       *region);
 
-void _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-                                           int width,
-                                           int height);
+gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
+                                               int width,
+                                               int height);
 
 cairo_surface_t * _gdk_windowing_create_cairo_surface (GdkDrawable *drawable,
                                                       int width,
index 5797591b387dc4375cbd0021de652926a9a9bc30..89f8bd7d79e2f97d0b168085e203898fca3dceeb 100644 (file)
@@ -1054,11 +1054,18 @@ recompute_visible_regions_internal (GdkWindowObject *private,
       width = private->abs_x + private->width;
       height = private->abs_y + private->height;
 
-      _gdk_windowing_set_cairo_surface_size (private->cairo_surface,
-                                            width, height);
-      cairo_surface_set_device_offset (private->cairo_surface,
-                                      private->abs_x,
-                                      private->abs_y);
+      if (_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
+                                                 width, height))
+        {
+          cairo_surface_set_device_offset (private->cairo_surface,
+                                           private->abs_x,
+                                           private->abs_y);
+        }
+      else
+        {
+          cairo_surface_destroy (private->cairo_surface);
+          private->cairo_surface = NULL;
+        }
     }
 }
 
index ddb481a389bb212c15618c78d8183735900dbbef..849d186ac9ab95f1f7ebfab5e1dd2446fe60b2d4 100644 (file)
@@ -32,12 +32,13 @@ typedef struct {
   CGContextRef  cg_context;
 } GdkQuartzCairoSurfaceData;
 
-void
+gboolean
 _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
                                       int              width,
                                       int              height)
 {
   /* This is not supported with quartz surfaces. */
+  return FALSE;
 }
 
 static void
index 17ccd615a64ebb646ab533dddfdb137ecb446d5b..403ffad12bc67cbdacc38b9bfe60d54c183a4b57 100644 (file)
@@ -670,12 +670,13 @@ gdk_win32_ref_cairo_surface (GdkDrawable *drawable)
   return impl->cairo_surface;
 }
 
-void
+gboolean
 _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
                                       gint width,
                                       gint height)
 {
   // Do nothing.  The surface size is determined by the DC
+  return FALSE;
 }
 
 static gint
index 02efc0d8405687e5b7d6744764585f90f8e6c048..961dad01abf784eb46a58487027a9d199be1f467 100644 (file)
@@ -461,12 +461,13 @@ gdk_x11_cairo_surface_destroy (void *data)
   impl->cairo_surface = NULL;
 }
 
-void
+gboolean
 _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
                                       int width,
                                       int height)
 {
   cairo_xlib_surface_set_size (surface, width, height);
+  return TRUE;
 }
 
 cairo_surface_t *